/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
 * Nihongo
 * Copyright (C) Massimiliano Maniscalco 2011, 2012 <massi.neptune@yahoo.com>
 * 
Nihongo is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Nihongo is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "test_scelta_mult_parole.h"

void TestSceltaMultParole::
run_test ( char *options )
{
	int nr = _contenuto->size();
	_domandeTotLabel->set_text ( Glib::ustring::format ( nr ) );
	_testWin->present ();
	_timer = 0;
	_nrDom = 0;
	_modo = options[0];
	_verso = options[1];
	_isGrammatica = options[2];
	_isCortese = options[3];
	_isAffermativa = options[4];
	update_window ();
}

void TestSceltaMultParole::
update_window ( void )
{
	Glib::ustring _domanda;
	Glib::ustring _primaRisposta;
	Glib::ustring _secondaRisposta;
	Glib::ustring _terzaRisposta;
	Glib::ustring _quartaRisposta;
	_domandaNumLabel->set_text ( Glib::ustring::format ( _nrDom + 1 ) );
	_timerConnection = Glib::signal_timeout ().connect_seconds (sigc::mem_fun (*this, &TestSceltaMultParole::on_timer_fired), 1 );
	_tempoLabel->set_text ( "00 : 00" );
	if ( _isGrammatica )
	{
		bool _affermativa = _isAffermativa >= 0 ? _isAffermativa : _random->get_bool ();
		bool _cortesia = _isCortese >= 0 ? _isCortese : _random->get_bool ();
		Glib::ustring _affStr = _affermativa ? "affermativa" : "negativa";
		Glib::ustring _cortStr = _cortesia ? "cortese" : "colloquiale";
		char _dmod = _modo == 0 ? -1 : _modo;
		Glib::ustring _coniugazione ( "" );
		bool isVerbo = _parolaCorrente->is_verbo ();
		_formaScelta = _modo;
		if ( _isCortese == -1 )
			_cortScelta = _cortesia;
		if ( _isAffermativa == -1 )
			_affScelta = _affermativa;
		nome_coniugazione ( _coniugazione, _dmod );
		if ( ( isVerbo && ( _formaScelta == 1 || _formaScelta == 2 || _formaScelta == 5 ) ) || ( !isVerbo && ( _formaScelta == 1 || _formaScelta == 2 || _formaScelta == 3 || _formaScelta == 6 || _formaScelta == 7 ) ) )
			_coniugazione += Glib::ustring ( " (" ) + _affStr + Glib::ustring ( " - " ) + _cortStr + Glib::ustring ( ")" );
		if ( isVerbo && ( _formaScelta == 4 || _formaScelta == 7 ) )
			_coniugazione += Glib::ustring ( " (" ) + _affStr + Glib::ustring ( ")" );
		if ( isVerbo && ( _formaScelta == 6 || _formaScelta == 8 || _formaScelta == 9 || _formaScelta == 10 || _formaScelta == 11 ) )
			_coniugazione += Glib::ustring ( " (" ) + _cortStr + Glib::ustring ( ")" );
		if ( _parolaCorrente->get_yomikata() == "" )
			_domanda = Glib::ustring ( "\"" ) + _coniugazione + Glib::ustring ( "\"\n" ) + _parolaCorrente->get_kotoba ();
		else
			_domanda = Glib::ustring ( "\"" ) + _coniugazione + Glib::ustring ( "\"\n" ) + _parolaCorrente->get_kotoba () + Glib::ustring ( " (" ) + _parolaCorrente->get_yomikata () + Glib::ustring ( " )" );
	}
	else
	{
		switch ( _modo )
		{
			case MOD_PAROLE_MEMORY:
				if ( _verso == JAP_ITA )
				{
					if ( _parolaCorrente->get_yomikata() == Glib::ustring ( "" ) )
						_domanda = _parolaCorrente->get_kotoba ();
					else
						_domanda = _parolaCorrente->get_kotoba () + "\n" + _parolaCorrente->get_yomikata ();
				}
				else
					_domanda = _parolaCorrente->get_gaikokugo ();
				break;
			case MOD_PAROLE_READING:
				_domanda = _parolaCorrente->get_kotoba ();
				break;
		}
	}
	_domandaLabel->set_text ( _domanda );
	possibili_risposte ( _primaRisposta, _secondaRisposta, _terzaRisposta, _quartaRisposta );
	_primaRispButton->set_label ( _primaRisposta );
	_secondaRispButton->set_label ( _secondaRisposta );
	_terzaRispButton->set_label ( _terzaRisposta );
	_quartaRispButton->set_label ( _quartaRisposta );
}

void TestSceltaMultParole::
possibili_risposte ( Glib::ustring &risp1, Glib::ustring &risp2, Glib::ustring &risp3, Glib::ustring &risp4 )
{
	_rispostaBuona = _random->get_int_range ( 0, 4 );
	Glib::ustring _risposte [4];
	const Parola *_par;
	if ( _isGrammatica )
		possibili_risposte_grammatica ( _risposte, _rispostaBuona );
	else
	{
		for ( char n = 0; n < 4; n++ )
		{
			if ( n == _rispostaBuona )
				_par = &(*_parolaCorrente);
			else
				_par = prendi_parola_casuale ();
			_risposte [n] = crea_etichetta ( *_par );
		}
	}
	risp1.assign ( _risposte [0] );
	risp2.assign ( _risposte [1] );
	risp3.assign ( _risposte [2] );
	risp4.assign ( _risposte [3] );
	_rispostaEsatta.assign ( _risposte [ _rispostaBuona ] );
}

void TestSceltaMultParole::
possibili_risposte_grammatica ( Glib::ustring *_rispArray, char _rispostaBuona )
{
	char numRisp [4];
	bool isVerbo = _parolaCorrente->is_verbo ();
	Glib::ustring rispostaEsatta ( "" );
	bool _cortesia = _isCortese >= 0 ? _isCortese : _cortScelta;
	bool _affermativa = _isAffermativa >= 0 ? _isAffermativa : _affScelta;
	forma_coniugata ( rispostaEsatta, _formaScelta, _cortesia, _affermativa );
	for ( char ns = 0; ns < 4; ns++ )
	{
		if ( ns == _rispostaBuona )
		{
			numRisp [ns] = _formaScelta;
			_rispArray [ns] = rispostaEsatta;
		}
		else
		{
			char n;
			bool again;
			Glib::ustring stringa ( "" );
			bool _cortRisp;
			bool _affRisp;
			do
			{
				n = isVerbo ? _random->get_int_range ( 1, 13 ) : _random->get_int_range ( 1, 8 );
				_cortRisp = _isCortese >= 0 ? _isCortese : _random->get_bool ();
				_affRisp = _isAffermativa >= 0 ? _isAffermativa : _random->get_bool ();
				forma_coniugata ( stringa, n, _cortRisp, _affRisp );
				again = false;
				if ( stringa.raw() == rispostaEsatta.raw() )
					again = true;
				if ( !again )
				{
					for ( char i = 0; i < ns; i++ )
					{
						if ( _rispArray [i].raw() == stringa.raw() )
						{
							again = true;
							break;
						}
					}
				}
			}
			while ( again );
			numRisp [ns] = n;
			_rispArray [ns] = stringa;
		}
	}
}

const Parola* TestSceltaMultParole::
prendi_parola_casuale ( void )
{
	bool result;
	unsigned int index;
	list<Parola>::iterator _itPar;
	do
	{
		_itPar = _tutte->begin ();
		index = _random->get_int_range ( 0, _tutte->size() );
		result = true;
		for ( unsigned int n = 0; n < index; n++ )
			_itPar++;
		if ( _modo == MOD_PAROLE_READING && _itPar->get_yomikata() == Glib::ustring ( "" ) )
			result = false;
	}
	while ( !result );
	return &(*_itPar);
}

Glib::ustring TestSceltaMultParole::
crea_etichetta ( const Parola &par )
{
	switch ( _modo )
	{
		case MOD_PAROLE_MEMORY:
			if ( _verso == JAP_ITA )
				return par.get_gaikokugo ();
			else
			{
				if ( par.get_yomikata() == Glib::ustring ( "" ) )
					return par.get_kotoba ();
				else
					return par.get_kotoba () + Glib::ustring ( "\n" ) + par.get_yomikata ();
			}
			break;
		case MOD_PAROLE_READING:
			return par.get_yomikata ();
			break;
	}
	return Glib::ustring ( "" );
}

void TestSceltaMultParole::
on_risposta ( char tasto )
{
	bool risultato = ( tasto == _rispostaBuona );
	_timerConnection.disconnect ();
	if ( _isGrammatica )
	{
		_parolaCorrente->test ( 3, risultato, _timer );
		commit_parole_changes.emit ( *_parolaCorrente );
	}
	else
	{
		_parolaCorrente->test ( _modo, risultato, _timer );
		commit_parole_changes.emit ( *_parolaCorrente );
	}
	if ( !risultato )
	{
		Glib::ustring messaggio = "Sbagliato, la risposta giusta è\n<b><big>" + _rispostaEsatta + "</big></b>";
		Gtk::MessageDialog *_alertDialog = new Gtk::MessageDialog ( *_testWin, "", false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, true);
		_alertDialog->set_message ( messaggio, true);
		int res_id = _alertDialog->run();
		delete _alertDialog;
	}
	next_question ();
}

void TestSceltaMultParole::
nome_coniugazione ( Glib::ustring &str, char _index )
{
	bool isVerbo = _parolaCorrente->is_verbo ();
	if ( _index < 1 )
	{
		char nr = isVerbo ? _random->get_int_range ( 1, 13 ) : _random->get_int_range ( 1, 8 );
		if ( _index < 0 )
		{
			_formaScelta = nr;
			_index = nr;
		}
	}
	if ( isVerbo )
	{
		switch ( _index )
		{
			case 1:
				str.assign ( Glib::ustring ( "presente" ) );
				break;
			case 2:
				str.assign ( Glib::ustring ( "passato" ) );
				break;
			case 3:
				str.assign ( Glib::ustring ( "forma in て" ) );
				break;
			case 4:
				str.assign ( Glib::ustring ( "desiderativo" ) );
				break;
			case 5:
				str.assign ( Glib::ustring ( "volitivo" ) );
				break;
			case 6:
				str.assign ( Glib::ustring ( "esortativo" ) );
				break;
			case 7:
				str.assign ( Glib::ustring ( "imperativo" ) );
				break;
			case 8:
				str.assign ( Glib::ustring ( "obbligo" ) );
				break;
			case 9:
				str.assign ( Glib::ustring ( "potenziale" ) );
				break;
			case 10:
				str.assign ( Glib::ustring ( "passivo" ) );
				break;
			case 11:
				str.assign ( Glib::ustring ( "causativo" ) );
				break;
			case 12:
				str.assign ( Glib::ustring ( "condizionale" ) );
				break;
			default:
				str.assign ( Glib::ustring ( "verbi overflow!" ) );
				break;
		}
	}
	else
	{
		switch ( _index )
		{
			case 1:
				str.assign ( Glib::ustring ( "presente" ) );
				break;
			case 2:
				str.assign ( Glib::ustring ( "passato" ) );
				break;
			case 3:
				str.assign ( Glib::ustring ( "sospensivo" ) );
				break;
			case 4:
				str.assign ( Glib::ustring ( "causale" ) );
				break;
			case 5:
				str.assign ( Glib::ustring ( "avverbiale" ) );
				break;
			case 6:
				str.assign ( Glib::ustring ( "diventare" ) );
				break;
			case 7:
				str.assign ( Glib::ustring ( "rendere" ) );
				break;
			default:
				str.assign ( Glib::ustring ( "aggettivi overflow!" ) );
				break;
		}
	}
}

void TestSceltaMultParole::
forma_coniugata ( Glib::ustring &str, char _index, bool _cortesia, bool _affermativa )
{
	bool isVerbo = _parolaCorrente->is_verbo ();
	if ( _index < 1 )
	{
		char nr = isVerbo ? _random->get_int_range ( 1, 13) : _random->get_int_range ( 1, 8 );
		if ( _index < 0 )
		{
			_formaScelta = nr;
			_index = nr;
		}
	}
	if ( isVerbo )
	{
		switch ( _index )
		{
			case 1:
				_parolaCorrente->get_presente ( str, _cortesia, _affermativa );
				break;
			case 2:
				_parolaCorrente->get_passato ( str, _cortesia, _affermativa );
				break;
			case 3:
				_parolaCorrente->get_verbo_in_te ( str );
				break;
			case 4:
				_parolaCorrente->get_desiderativo ( str, _affermativa );
				break;
			case 5:
				_parolaCorrente->get_volitivo ( str, _cortesia, _affermativa );
				break;
			case 6:
				_parolaCorrente->get_esortativo ( str, _cortesia );
				break;
			case 7:
				_parolaCorrente->get_imperativo ( str, _affermativa );
				break;
			case 8:
				_parolaCorrente->get_obbligo ( str, _cortesia );
				break;
			case 9:
				_parolaCorrente->get_potenziale ( str, _cortesia );
				break;
			case 10:
				_parolaCorrente->get_passivo ( str, _cortesia );
				break;
			case 11:
				_parolaCorrente->get_causativo ( str, _cortesia );
				break;
			case 12:
				_parolaCorrente->get_condizionale ( str );
				break;
			default:
				str.assign ( "verbi overflow" );
				break;
		}
	}
	else
	{
		switch ( _index )
		{
			case 1:
				_parolaCorrente->get_presente ( str, _cortesia, _affermativa );
				break;
			case 2:
				_parolaCorrente->get_passato ( str, _cortesia, _affermativa );
				break;
			case 3:
				_parolaCorrente->get_sospensivo ( str, _cortesia, _affermativa );
				break;
			case 4:
				_parolaCorrente->get_causale ( str );
				break;
			case 5:
				_parolaCorrente->get_avverbiale ( str );
				break;
			case 6:
				_parolaCorrente->get_diventare ( str, _cortesia, _affermativa );
				break;
			case 7:
				_parolaCorrente->get_rendere ( str, _cortesia, _affermativa );
				break;
			default:
				str.assign ( "aggettivi overflow" );
				break;
		}
	}
}

void TestSceltaMultParole::
next_question ( void )
{
	_timer = 0;
	_nrDom++;
	_parolaCorrente++;
	if ( _parolaCorrente == _contenuto->end() )
		_testWin->hide();
	else
		update_window ();
}

bool TestSceltaMultParole::
show_result ( void )
{
	bool presented;
	_resultCtrl->set_modo ( _modo );
	presented = _resultCtrl->present_window ();
	return presented;
}
